#ifndef __SYNTACTIC_SUGAR_H__
#define __SYNTACTIC_SUGAR_H__

#include <stdint.h>

#ifndef BIT_BAND
#define BIT_BAND(addr, bit) *(volatile unsigned long *)(((uint32_t)(addr)&0xF0000000) + \
                                                        0x2000000 + (((uint32_t)(addr)&0xFFFFF) << 5) + ((bit) << 2))
#endif

#define SWAP8(x) (((x) << 8) | ((x) >> 8))
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))

#ifndef dimof
#define dimof(__array) (sizeof(__array) / sizeof(__array[0]))
#endif

#ifndef __at
    #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 6000000)
        #define __at(_addr) __attribute__((at(_addr)))
    #else /*defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 6000000)*/
        #define mypinjie(a,b) a#b
        #define __at(_addr) __attribute__((section(mypinjie(".ARM.__at_",_addr))))
    #endif /*defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 6000000)*/
#endif /*ifndef __at*/

#define __impl_table(__item_type, ...) \
    .ptItems = (const __item_type[]){  \
        __VA_ARGS__},                  \
    .hwCount = sizeof((__item_type[]){__VA_ARGS__}) / sizeof(__item_type), .hwItemSize = sizeof(__item_type)

#define impl_table(__item_type, ...) \
    __impl_table(__item_type, __VA_ARGS__)

#define WRGPIO(P, B, S) (S) ? (GPIO##P->BSRR = GPIO_PIN_##B) : (GPIO##P->BSRR = ((uint32_t)GPIO_PIN_##B << 16))

#define RDGPIO(P, B) (((GPIO##P->IDR & GPIO_PIN_##B) != GPIO_PIN_##B) ? 0 : 1)

#endif
